#include "ArchivoUsuarios.h"
#include "Lock.h"
#include <jsoncpp/json.h>
#include <iostream>

ArchivoUsuarios::ArchivoUsuarios()
{
	archivoUsuarios.open("ArchivoUsuarios.txt", std::ios::in);

	//Si hay usuarios guardados los cargo
	if(archivoUsuarios.is_open()){
		Json::Reader lector;
		lector.parse(archivoUsuarios, usuarios);
	}
	archivoUsuarios.close();
}

bool ArchivoUsuarios::obtenerUsuario(Usuario& user, const std::string nombre)
{
	if(existeUsuario(nombre)){
		user.setNombre(nombre);
		user.setContrasena(usuarios[nombre]["contrasena"].asString());
		user.setMaxNivelAlcanzado(usuarios[user.getNombre()]["maxNivelAlcanzado"].asUInt());
		sesionesIniciadas[nombre] = true;
	}
	return false;
}

bool ArchivoUsuarios::crearUsuario(const std::string& nombre,
		const std::string& contrasena)
{
	//Si no existe un usuario con ese nombre
	if(!existeUsuario(nombre) && (contrasena != "")){
		//Creo el usuario;
		Lock lock(mutex);
		usuarios[nombre]["contrasena"] = contrasena;
		usuarios[nombre]["maxNivelAlcanzado"] = 1;
		return true;
	}
	return false;
}

bool ArchivoUsuarios::autenticar(const std::string& nombre,
		const std::string& contrasena)
{
	Lock lock(mutex);
	if(existeUsuario(nombre)) {
		if(usuarios[nombre]["contrasena"] == contrasena)
			return true;
	}

	return false;
}

bool ArchivoUsuarios::existeUsuario(const std::string& nombre)
{
	 return (usuarios.get(nombre, "") != "");
}

void ArchivoUsuarios::guardarUsuario(const Usuario& usuario)
{
	Lock lock(mutex);
	if(existeUsuario(usuario.getNombre())) {
		usuarios[usuario.getNombre()]["maxNivelAlcanzado"] = usuario.getMaxNivelAlcanzado();
	}
}

ArchivoUsuarios::~ArchivoUsuarios()
{
	archivoUsuarios.open("ArchivoUsuarios.txt", std::ios::out);

	Json::StyledStreamWriter writer;

	//Persisto todos los usuarios en un archivo
	writer.write(archivoUsuarios, usuarios);

	archivoUsuarios.close();
}
